Zavirani childoken v MDI aplikaci

Otázka od: Ing. Igor Vodicka

14. 10. 2004 7:56

Ahoj do kofery!

V MDI aplikaci mam funkci, ktera zavira vsechna otevrena childokna. Pouzivam
nasledujici konstrukci:

for I := MDIChildCount-1 downto 0 do
  MDIChildren[I].Close;

Childokno ma nadefinovanou udalost OnClose, kde provadim nasledujici test:

if MainForm.MDIChildCount=1 then //kdyz zustava posledni otevrene okno
begin
  .
  neco;
  .
end;

Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne okna v cyklu
zavirana, ale zustava na hodnote puvodniho postu oken.
Nevite nekdo jak zaridit, aby se hodnota MDIChildCount aktualizovala? Delam
v D5 Ent na W2K.

Diky za kazde nakopnuti

Ing. Igor Vodicka
informacni systemy
Nakladatelstvi Sagit
Tel.: 59 6786 001
HTTP://www.sagit.cz/

Odpovedá: Marian Nykel

8. 10. 2004 7:11

A nepomuze tohle:
 for I := MDIChildCount-1 downto 1 do
   MDIChildren[I].Close;


MN

Ing. Igor Vodicka napsal(a):
> for I := MDIChildCount-1 downto 0 do
> MDIChildren[I].Close;
>
> Childokno ma nadefinovanou udalost OnClose, kde provadim nasledujici test:
>
> if MainForm.MDIChildCount=1 then //kdyz zustava posledni otevrene okno
> begin
> .
> neco;
> .
> end;
>
> Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne okna v cyklu
> zavirana, ale zustava na hodnote puvodniho postu oken.
> Nevite nekdo jak zaridit, aby se hodnota MDIChildCount aktualizovala? Delam
> v D5 Ent na W2K.
>
> Diky za kazde nakopnuti



Odpovedá: Jan Sebelik

8. 10. 2004 8:15

> V MDI aplikaci mam funkci, ktera zavira vsechna otevrena
> childokna. Pouzivam
> nasledujici konstrukci:
>
> for I := MDIChildCount-1 downto 0 do
> MDIChildren[I].Close;
>
> Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne
> okna v cyklu
> zavirana, ale zustava na hodnote puvodniho postu oken.
> Nevite nekdo jak zaridit, aby se hodnota MDIChildCount
> aktualizovala? Delam

Problem spociva v tom, ze Close okno fakticky nezavre, ale jenom posle message
WM_CLOSE (resp. neco podobneho).
viz Close - FInd Declaration
Tyto zpravy zustavaji ve fronte zprav a zpracuji se az tehdy, kdyz cyklus
skonci.
Proto by (ac to zni mozna prekvapive) fungovalo i

for I := 0 to MDIChildCount-1 do
  MDIChildren[I].Close;

Jednou z moznosti, jak to resit je

for I := MDIChildCount-1 downto 0 do begin
  MDIChildren[I].Close;
  Application.ProcessMessages;
end;

Ale na to pozor - aplikace uprostred cyklu zpracuje nejen tyto zpravy, ale i
vsechny ostatni.
Mohlo by tak dojit ke spusteni evenhandleru, ktere v danem okamziku nechceme.

Cistsi reseni - to by bylo treba vedet, co se na OnClose posledniho okna deje.

viz nase kurzy Delphi.

Honza
====================================
= RNDr. Jan Sebelik - HAES
= Skolici a konzultacni stredisko pro vyvoj SW
= www.haes.cz
= Vojtiskova 321
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347 735)
====================================


Odpovedá: Pave Gazda

13. 10. 2004 9:07

Ahoj

> for I := MDIChildCount-1 downto 0 do
> MDIChildren[I].Close;
>
> if MainForm.MDIChildCount=1 then //kdyz zustava posledni otevrene okno
> begin
> .
> neco;
> .
> end;
>
> Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne okna v
> cyklu
> zavirana, ale zustava na hodnote puvodniho postu oken.
> Nevite nekdo jak zaridit, aby se hodnota MDIChildCount aktualizovala?
> Delam
> v D5 Ent na W2K.
>

jak uz nekdo rikal, zalezi na tom, co to "neco" dela

Pak jsou moznosti:

for I := MDIChildCount-1 downto 1 do
  MDIChildren[I].Close;
MDIChildren[0].ClosePosledni;

nebo treba

for I := MDIChildCount-1 downto 1 do
  MDIChildren[I].Close;
.. pockej na zavreni (MDIChildCount = 1)
MDIChildren[0].Close;


Pavel



Odpovedá: David Hrbac

14. 10. 2004 8:53

Ahoj,
Po close child okna dej Application.ProcessMessages, bude to fungovat.
David

-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
Behalf Of Ing. Igor Vodicka
Sent: Thursday, October 14, 2004 8:56 AM
To: delphi-l@clexpert.cz
Subject: Zavirani childoken v MDI aplikaci


Ahoj do kofery!

V MDI aplikaci mam funkci, ktera zavira vsechna otevrena childokna. Pouzivam
nasledujici konstrukci:

for I := MDIChildCount-1 downto 0 do
  MDIChildren[I].Close;

Childokno ma nadefinovanou udalost OnClose, kde provadim nasledujici test:

if MainForm.MDIChildCount=1 then //kdyz zustava posledni otevrene okno begin
  .
  neco;
  .
end;

Problem je ten, ze MDIChildCount se nesnizuje jak jsou postupne okna v cyklu
zavirana, ale zustava na hodnote puvodniho postu oken. Nevite nekdo jak
zaridit, aby se hodnota MDIChildCount aktualizovala? Delam v D5 Ent na W2K.

Diky za kazde nakopnuti

Ing. Igor Vodicka
informacni systemy
Nakladatelstvi Sagit
Tel.: 59 6786 001
HTTP://www.sagit.cz/


Odpovedá: Petr Vones

14. 10. 2004 13:12

From: "David Hrbac" <hrbac.conf@seznam.cz>
> Po close child okna dej Application.ProcessMessages, bude to fungovat.

V zadnem pripade v aplikaci nevolej Application.ProcessMessages

Petr Vones


Odpovedá: David Hrbac

14. 10. 2004 13:15

A to jako proc?
David

-----Original Message-----
> Po close child okna dej Application.ProcessMessages, bude to fungovat.

V zadnem pripade v aplikaci nevolej Application.ProcessMessages

Petr Vones



Odpovedá: Ludek Finstrle

14. 10. 2004 13:20

> V zadnem pripade v aplikaci nevolej Application.ProcessMessages

Nesleduji moc tento thread, ale je to globalni tvrzeni? A pokud ano,
co je duvodem to nedelat? Pripadne co misto toho volat?

Luf


Odpovedá: Petr Vones

14. 10. 2004 14:21

From: "Ludek Finstrle" <ludek.finstrle@pzkagis.cz>
> Nesleduji moc tento thread, ale je to globalni tvrzeni? A pokud ano,

Protoze tak dojde ke zpracovani zprav mimo smycku Application.Run, ktere muze
vyvolat nezadouci kod z mista, kde se zavolalo Application.ProcessMessages.

> Pripadne co misto toho volat?

Nic. Pokud aplikace provadi nejakou delsi akci mela by byt tato v samostatnem
threadu.

Petr Vones